// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Tails Object Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//
private alias 2 : TYPE_TAILSOBJECT

private alias object.value0 : player.rings
private alias object.value3 : player.drownCounter // Countdown before player moves to next drown "level"
private alias object.value4 : player.drownLevel
private alias object.value5 : player.CustomRollAnimSpeed
private alias object.value6 : player.speedShoes
private alias object.value7 : player.invincible
private alias object.value8 : player.invulnerable
private alias object.value9 : player.minRollSpeed
private alias object.value10 : player.animationReserve // Used by springs to store what animation will play after the bounce animation
private alias object.value11 : camera.lockTimer // A timer of how long the camera will stay locked for
private alias object.value12 : player.tailsFrame
private alias object.value13 : player.tailsAnim
private alias object.value14 : player.skidding
private alias object.value15 : player.dropDashCharge
private alias object.value16 : player.isPlayer2 // 0/false is player 1, 1/true if player 2
private alias object.value17 : debugMode.currentSelection
private alias object.value18 : player.sortedDrawOrder
private alias object.value19 : player.enemyChainCounter // How many enemies the player has bounced on in a row
private alias object.value20 : player.speedCap // Not to be confused with options.speedCap
private alias object.value21 : player.acceleration
private alias object.value22 : player.deceleration
private alias object.value23 : player.airAcceleration
private alias object.value24 : player.groundRotation
private alias object.value25 : player.gravityValue // Also used in underwater checks , 0x1000 if underwater, otherwise 0x3800. Not to be confused with player.gravity
private alias object.value26 : player.flightVelocity // Used by Tails only
private alias object.value27 : player.jumpVelocity
private alias object.value28 : player.jumpStrength
private alias object.value29 : player.rollingDecelerationA // Active rolling deceleration - With the player holding the opposite direction
private alias object.value30 : player.jumpOffset // Added to the player's position when jumping/rolling. Normally -5 for S&K, and -1 for Tails
private alias object.value31 : player.rollingDecelerationP // Passive rolling deceleration - Without the player holding the opposite direction
private alias object.value32 : player.jumpAbility // Used to store whatever function this player has for its jump ability
private alias object.value33 : player.spindashFunction // Used to store whatever function this player has for its spindash ability
private alias object.value34 : player.collisionEnabled
private alias object.value35 : player.doubleJumpState
private alias object.value36 : player.tailsGrabTimeout // Tails assist lockout timer
private alias object.value37 : player.shield // Current shield the player has, see above constants for what is what
private alias object.value38 : player.hitboxTop
private alias object.value39 : player.hitboxBottom
private alias object.value40 : player.hitboxLeft
private alias object.value41 : player.hitboxRight
private alias object.value42 : player.prevGravity
private alias object.value43 : player.jumpInTimer
private alias object.value44 : player.p2InputFunction
private alias object.value45 : player.autoJumpTimer
private alias object.value46 : player.targetLeaderPos.x
private alias object.value47 : player.targetLeaderPos.y

// Function declarations
reserve function TailsObject_Function61

// Static Values

// Tables

function TailsObject_Function61
	switch player.tailsAnim
	case 0
		if object.frame == 0
			player.tailsFrame++
			player.tailsFrame %= 40
		end if
		break
	case 1
	case 3
	case 4
		player.tailsFrame++
		player.tailsFrame %= 40
		break
	case 7
	case 9
	case 10
	//case 43
		player.tailsFrame++
		player.tailsFrame %= 16
		break
	case 17
		player.tailsFrame++
		player.tailsFrame %= 40
		break
	end switch
end function


event ObjectMain
	if stage.debugMode == 1
		CallFunction(PlayerObject_ProcessPlayer)
		CheckEqual(options.attractMode, 0)
		temp0 = checkResult
		CheckEqual(inputPress.buttonB, 1)
		temp0 &= checkResult
		if temp0 == 1
			
			CheckEqual(object.animation, ANI_DROWNING)
			temp1 = checkResult
			CheckEqual(object.animation, ANI_DYING)
			temp1 |= checkResult
			if temp1 == 1
				stage.timeEnabled = 1
				stage.pauseEnabled = 1
			end if	
			
			object.type = TypeName[Debug Mode]
			object.yvel = 0
			object.state = PlayerObject_Blank
			object.frame = 0
			object.rotation = 0
			object.interaction = 0
			object.drawOrder = 4
			object.priority = PRIORITY_ACTIVE
			player.invulnerable = 0
			object.visible = 1
			object.value2 = 0
			player.drownCounter = 0
			player.drownLevel = 0
			object.frame = debugMode.currentSelection
			screen.cameraEnabled = 1
			screen.cameraStyle = 0
			StopSfx(SfxName[Flying])
			StopSfx(SfxName[Jump])
			if stage.state == 3
				stage.state = STAGE_RUNNING
			end if
			if object[1].type == TypeName[Player 2 Object]
				object[1].priority = PRIORITY_ACTIVE
			end if
			if object[+playerCount].propertyValue == 3
				object[+playerCount].type = TypeName[Invincibility]
				object[+playerCount].propertyValue = 0
			end if
		else
			if object.gravity == GRAVITY_GROUND
				player.doubleJumpState = 0
			end if
			CallFunction(object.state)
			ProcessAnimation()
			CallFunction(TailsObject_Function61)
			if object.animation == ANI_JUMPING
				screen.adjustCameraY = player.jumpOffset
			else
				if screen.adjustCameraY == player.jumpOffset
					screen.adjustCameraY = 0
					object.iypos += player.jumpOffset
				end if
			end if
			if player.collisionEnabled == 0
				temp0 = player.prevGravity
				player.prevGravity = object.gravity
				ProcessObjectMovement()
				player.prevGravity ^= 1
				CheckEqual(object.gravity, GRAVITY_GROUND)
				player.prevGravity |= checkResult
				player.prevGravity ^= 1
				if temp0 == 1
					if player.prevGravity == 0
						player.enemyChainCounter = 0
						achieveRingCount = 0
						if object.animation == ANI_JUMPING
							if object.down == 0
								if object.state != PlayerObject_HandleRoll
									if object.state != PlayerObject_Unknown2
										object.animation = ANI_WALKING
										if object.entityPos == screen.cameraTarget
											screen.adjustCameraY = 0
										end if
										object.iypos += player.jumpOffset
									end if
								end if
							end if
						end if
					end if
				end if
			else
				player.collisionEnabled = 0
			end if
		end if
	else
		CallFunction(PlayerObject_ProcessPlayer)
		if object.gravity == GRAVITY_GROUND
			player.doubleJumpState = 0
		end if
		CallFunction(object.state)
		ProcessAnimation()
		CallFunction(TailsObject_Function61)
		if object.animation == ANI_JUMPING
			screen.adjustCameraY = player.jumpOffset
		else
			if screen.adjustCameraY == player.jumpOffset
				screen.adjustCameraY = 0
				object.iypos += player.jumpOffset
			end if
		end if
		if player.collisionEnabled == 0
			temp0 = player.prevGravity
			player.prevGravity = object.gravity
			ProcessObjectMovement()
			player.prevGravity ^= 1
			CheckEqual(object.gravity, GRAVITY_GROUND)
			player.prevGravity |= checkResult
			player.prevGravity ^= 1
			if temp0 == 1
				if player.prevGravity == 0
					player.enemyChainCounter = 0
					achieveRingCount = 0
					if object.animation == ANI_JUMPING
						if object.down == 0
							if object.state != PlayerObject_HandleRoll
								if object.state != PlayerObject_Unknown2
									object.animation = ANI_WALKING
									if object.entityPos == screen.cameraTarget
										screen.adjustCameraY = 0
									end if
									object.iypos += player.jumpOffset
								end if
							end if
						end if
					end if
				end if
			end if
		else
			player.collisionEnabled = 0
		end if
	end if
	CallFunction(PlayerObject_ProcessSuperForms)
	
	if inputPress.buttonY == 1
		if options.gameMode == 2
			if stage.timeEnabled == 1
				stage.timeEnabled = 0
				ResetObjectEntity(11, TypeName[Title Card], 0, 0, 0)
				object[11].state = 10
				object[11].priority = PRIORITY_ACTIVE
				object[11].drawOrder = 6
				player.invincible = 80
				screen.cameraEnabled = 0			
			end if
		else
			if PlayerObject_SuperState == 1
				if object.animation != ANI_SUPER_TRANSFORM
					if saved.Supercancel == 1
						CallFunction(PlayerObject_EndSuper)
					end if
				end if
			end if
		end if
	end if
end event


event ObjectDraw
		if object.animation != object.prevAnimation
			object.prevAnimation = object.animation
			object.frame = 0
			object.animationTimer = 0
			object.animationSpeed = 0
		end if
		if player.tailsAnim != object.animation
			if object.animation > 4
				player.tailsFrame = 0
			end if
			if player.tailsAnim > 4
				player.tailsFrame = 0
			end if
			player.tailsAnim = object.animation
		end if
		switch player.tailsAnim
		case 0
			if object.frame == 0
				temp0 = player.tailsFrame
				temp0 >>= 3
				if object.visible == 1
					DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
				end if
			end if
			break
		case 1
		case 3
		case 4
		case 37
			temp0 = player.tailsFrame
			temp0 >>= 3
			if object.visible == 1
				DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
			end if
			break
		case 7
		case 9
			temp0 = player.tailsFrame
			temp0 >>= 2
			temp0 += 10
			if object.visible == 1
				DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
			end if
			break
		case 10
		//case 43
			temp0 = player.tailsFrame
			temp0 >>= 2
			CheckEqual(object.xvel, 0)
			temp1 = checkResult
			CheckEqual(object.yvel, 0)
			temp1 &= checkResult
			temp2 = object.rotation
			if temp1 == 0
				temp0 += 5
				ATan2(object.rotation, object.xvel, object.yvel)
				if object.direction == FLIP_X
					object.rotation += 128
				end if
			else
				temp0 += 5
				object.rotation = 0
			end if
			object.rotation <<= 1
			if object.visible == 1
				DrawSpriteFX(temp0, FX_ROTATE, object.xpos, object.ypos)
			end if
			object.rotation = temp2
			break
		case 17
			temp0 = player.tailsFrame
			temp0 /= 10
			temp0 += 10
			if object.visible == 1
				DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
			end if
			break
		end switch
			
		if saved.rotate == 0
			CallFunction(PlayerObject_Force45)
		else
			CallFunction(PlayerObject_ManiaRotate)
			//DrawObjectAnimation()
		end if
end event


event ObjectStartup
	if stage.playerListPos == 1
		LoadSpriteSheet("Players/Tails1.gif")
		LoadAnimation("Tails.ani")
		SpriteFrame(-22, -8, 16, 24, 82, 199)
		SpriteFrame(-26, -8, 20, 24, 99, 199)
		SpriteFrame(-26, -8, 20, 24, 120, 199)
		SpriteFrame(-26, -8, 20, 24, 141, 199)
		SpriteFrame(-26, -8, 20, 24, 162, 199)
		
		SpriteFrame(-35, -8, 24, 16, 231, 166)
		SpriteFrame(-35, -8, 24, 16, 231, 183)
		SpriteFrame(-35, -8, 24, 16, 231, 200)				
		SpriteFrame(-35, -8, 24, 16, 223, 100)
		
		SpriteFrame(-25, 9, 18, 16, 237, 234) //Unused??
		
		SpriteFrame(-30, -6, 24, 16, 231, 166)
		SpriteFrame(-30, -6, 24, 16, 231, 183)
		SpriteFrame(-30, -6, 24, 16, 231, 200)
		SpriteFrame(-30, -6, 24, 16, 223, 100)
	end if
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
